@file:JvmName("StandardFunction")

package dsl

/**
 * 聚合函数COUNT(*)
 * @return QueryAggFunction 聚合函数表达式
 */
fun count(): QueryAggFunction {
    return QueryAggFunction("COUNT", listOf())
}

/**
 * 聚合函数COUNT
 * @param query Query 待聚合的表达式
 * @return QueryAggFunction 聚合函数表达式
 */
fun count(query: Query): QueryAggFunction {
    return QueryAggFunction("COUNT", listOf(query))
}

/**
 * 聚合函数COUNT
 * @param column String 待聚合的列名
 * @return QueryAggFunction 聚合函数表达式
 */
fun count(column: String): QueryAggFunction {
    return QueryAggFunction("COUNT", listOf(QueryColumn(column)))
}

/**
 * 带有DISTINCT聚合函数COUNT
 * @param query Query 待聚合的表达式
 * @return QueryAggFunction 聚合函数表达式
 */
fun countDistinct(query: Query): QueryAggFunction {
    return QueryAggFunction("COUNT", listOf(query), true)
}

/**
 * 带有DISTINCT聚合函数COUNT
 * @param column String 待聚合的列名
 * @return QueryAggFunction 聚合函数表达式
 */
fun countDistinct(column: String): QueryAggFunction {
    return QueryAggFunction("COUNT", listOf(column(column)), true)
}

/**
 * 聚合函数SUM
 * @param query Query 待聚合的表达式
 * @return QueryAggFunction 聚合函数表达式
 */
fun sum(query: Query): QueryAggFunction {
    return QueryAggFunction("SUM", listOf(query))
}

/**
 * 聚合函数SUM
 * @param column String 待聚合的列名
 * @return QueryAggFunction 聚合函数表达式
 */
fun sum(column: String): QueryAggFunction {
    return QueryAggFunction("SUM", listOf(QueryColumn(column)))
}

/**
 * 聚合函数AVG
 * @param query Query 待聚合的表达式
 * @return QueryAggFunction 聚合函数表达式
 */
fun avg(query: Query): QueryAggFunction {
    return QueryAggFunction("AVG", listOf(query))
}

/**
 * 聚合函数AVG
 * @param column String 待聚合的列名
 * @return QueryAggFunction 聚合函数表达式
 */
fun avg(column: String): QueryAggFunction {
    return QueryAggFunction("AVG", listOf(QueryColumn(column)))
}

/**
 * 聚合函数MAX
 * @param query Query 待聚合的表达式
 * @return QueryAggFunction 聚合函数表达式
 */
fun max(query: Query): QueryAggFunction {
    return QueryAggFunction("MAX", listOf(query))
}

/**
 * 聚合函数MAX
 * @param column String 待聚合的列名
 * @return QueryAggFunction 聚合函数表达式
 */
fun max(column: String): QueryAggFunction {
    return QueryAggFunction("MAX", listOf(QueryColumn(column)))
}

/**
 * 聚合函数MIN
 * @param query Query 待聚合的表达式
 * @return QueryAggFunction 聚合函数表达式
 */
fun min(query: Query): QueryAggFunction {
    return QueryAggFunction("MIN", listOf(query))
}

/**
 * 聚合函数MIN
 * @param column String 待聚合的列名
 * @return QueryAggFunction 聚合函数表达式
 */
fun min(column: String): QueryAggFunction {
    return QueryAggFunction("MIN", listOf(QueryColumn(column)))
}

/**
 * 窗口函数用聚合函数RANK
 * @return QueryAggFunction 聚合函数表达式
 */
fun rank(): QueryAggFunction {
    return QueryAggFunction("RANK", listOf())
}

/**
 * 窗口函数用聚合函数DENSE_RANK
 * @return QueryAggFunction 聚合函数表达式
 */
fun denseRank(): QueryAggFunction {
    return QueryAggFunction("DENSE_RANK", listOf())
}

/**
 * 窗口函数用聚合函数ROW_NUMBER
 * @return QueryAggFunction 聚合函数表达式
 */
fun rowNumber(): QueryAggFunction {
    return QueryAggFunction("ROW_NUMBER", listOf())
}